#!/bin/bash
echo "===== 开始磁盘性能测试 ====="
# 记录开始时间
start_time=$(date +%s.%N)
# 检查必要的工具是否安装并可用
if ! command -v fio &> /dev/null || ! command -v iostat &> /dev/null || ! command -v blktrace &> /dev/null; then
    echo "缺少必要的调优工具，请检查环境配置"
    exit 1
fi
# 设置磁盘性能测试参数
DISK="/dev/sda"  # 根据实际情况调整目标磁盘
IOPS_THRESHOLD=2000  # 调整IOPS阈值
# 磁盘性能测试任务定义
fio_test() {
    fio --filename=$DISK/testfile --direct=1 --rw=randwrite --bs=4k --iodepth=32 --numjobs=8 --runtime=60s --group_reporting > /tmp/fio_result.txt
}
# 磁盘性能测试与分析
fio_test
# 收集磁盘I/O指标
iostat -d -k 1 5 $DISK | awk '/avg.*$/' >> /tmp/iostat_result.txt
blktrace -d $DISK -o /tmp/blktrace_output.log -t > /dev/null &
# 分析测试结果并进行调优
echo "===== 开始分析磁盘性能 ====="
IOPS=$(cat /tmp/fio_result.txt | grep "IOPS" | awk '{print $2}')
if [ "$IOPS" -lt "$IOPS_THRESHOLD" ]; then
    echo "检测到磁盘IOPS异常，开始进行优化..."
    # 优化磁盘队列深度和电梯算法
    echo " elevator=deadline" >> /sys/block/$DISK/queue/scheduler
    for depth in 64 128; do
        echo $depth > /sys/block/$DISK/queue/max_queue_depth
        echo "调整队列深度为: $depth"
        sleep 5s
    done
else
    echo "磁盘性能正常，无需优化"
fi
# 记录结束时间
end_time=$(date +%s.%N)
duration=$(echo "$end_time - $start_time" | bc)
# 结构化输出性能指标
echo "===== 测试摘要 ====="
echo "总执行时间: ${duration}秒"
echo "磁盘IOPS: ${IOPS}"
echo "磁盘队列深度: $(cat /sys/block/$DISK/queue/max_queue_depth)"
echo "电梯算法状态: $(cat /sys/block/$DISK/queue/scheduler)"
# 结构化输出
echo "===== 性能指标 ====="
echo '{
    "total_time": "'$duration'",
    "disk_iops": "'$IOPS'",
    "queue_depth": "'$(cat /sys/block/$DISK/queue/max_queue_depth)'",
    "scheduler": "'$(basename $(cat /sys/block/$DISK/queue/scheduler))'"
}'